{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this notebook, you will implement the kinematic bicycle model. The model accepts velocity and steering rate inputs and steps through the bicycle kinematic equations. Once the model is implemented, you will provide a set of inputs to drive the bicycle in a figure 8 trajectory.\n",
    "\n",
    "The bicycle kinematics are governed by the following set of equations:\n",
    "\n",
    "\\begin{align*}\n",
    "\\dot{x}_c &= v \\cos{(\\theta + \\beta)} \\\\\n",
    "\\dot{y}_c &= v \\sin{(\\theta + \\beta)} \\\\\n",
    "\\dot{\\theta} &= \\frac{v \\cos{\\beta} \\tan{\\delta}}{L} \\\\\n",
    "\\dot{\\delta} &= \\omega \\\\\n",
    "\\beta &= \\tan^{-1}(\\frac{l_r \\tan{\\delta}}{L})\n",
    "\\end{align*}\n",
    "\n",
    "where the inputs are the bicycle speed $v$ and steering angle rate $\\omega$. The input can also directly be the steering angle $\\delta$ rather than its rate in the simplified case. The Python model will allow us both implementations.\n",
    "\n",
    "In order to create this model, it's a good idea to make use of Python class objects. This allows us to store the state variables as well as make functions for implementing the bicycle kinematics. \n",
    "\n",
    "The bicycle begins with zero initial conditions, has a maximum turning rate of 1.22 rad/s, a wheelbase length of 2m, and a length of 1.2m to its center of mass from the rear axle.\n",
    "\n",
    "From these conditions, we initialize the Python class as follows:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from math import sin, cos, tan, atan2\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.image as mpimg\n",
    "\n",
    "class Bicycle():\n",
    "    def __init__(self):\n",
    "        self.xc = 0\n",
    "        self.yc = 0\n",
    "        self.theta = 0\n",
    "        self.delta = 0\n",
    "        self.beta = 0\n",
    "        \n",
    "        self.L = 2\n",
    "        self.lr = 1.2\n",
    "        self.w_max = 1.22\n",
    "        \n",
    "        self.sample_time = 0.01\n",
    "        \n",
    "    def reset(self):\n",
    "        self.xc = 0\n",
    "        self.yc = 0\n",
    "        self.theta = 0\n",
    "        self.delta = 0\n",
    "        self.beta = 0"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A sample time is required for numerical integration when propagating the kinematics through time. This is set to 10 milliseconds. We also have a reset function which sets all the state variables back to 0. \n",
    "\n",
    "With this sample time, implement the kinematic model using the function $\\textit{step}$ defined in the next cell. The function should take speed + angular rate as inputs and update the state variables. Don't forget about the maximum turn rate on the bicycle!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Bicycle(Bicycle):\n",
    "    def step(self, v, w):\n",
    "        # ==================================\n",
    "        #  Implement kinematic model here\n",
    "        # ==================================\n",
    "        xc_dot = v * cos(self.theta + self.beta)\n",
    "        yc_dot = v * sin(self.theta + self.beta)\n",
    "        theta_dot = v * cos(self.beta) * tan(self.delta) / self.L\n",
    "        delta_dot = max(-self.w_max, min(self.w_max, w))\n",
    "        self.xc += xc_dot * self.sample_time\n",
    "        self.yc += yc_dot * self.sample_time\n",
    "        self.theta += theta_dot * self.sample_time\n",
    "        self.delta += delta_dot * self.sample_time\n",
    "        self.beta = atan2(self.lr * tan(self.delta), self.L)\n",
    "        "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "With the model setup, we can now start giving bicycle inputs and producing trajectories. \n",
    "\n",
    "Suppose we want the model to travel a circle of radius 10 m in 20 seconds. Using the relationship between the radius of curvature and the steering angle, the desired steering angle can be computed.\n",
    "\n",
    "\\begin{align*}\n",
    "    \\tan{\\delta} &= \\frac{L}{r} \\\\\n",
    "    \\delta &= \\tan^{-1}(\\frac{L}{r}) \\\\\n",
    "           &= \\tan^{-1}(\\frac{2}{10}) \\\\\n",
    "           &= 0.1974\n",
    "\\end{align*}\n",
    "\n",
    "If the steering angle is directly set to 0.1974 using a simplied bicycled model, then the bicycle will travel in a circle without requiring any additional steering input. \n",
    "\n",
    "The desired speed can be computed from the circumference of the circle:\n",
    "\n",
    "\\begin{align*}\n",
    "    v &= \\frac{d}{t}\\\\\n",
    "     &= \\frac{2 \\pi 10}{20}\\\\\n",
    "     &= \\pi\n",
    "\\end{align*}\n",
    "\n",
    "We can now implement this in a loop to step through the model equations. We will also run our bicycle model solution along with your model to show you the expected trajectory. This will help you verify the correctness of your model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "sample_time = 0.01\n",
    "time_end = 20\n",
    "model = Bicycle()\n",
    "\n",
    "# set delta directly\n",
    "model.delta = np.arctan(2/10)\n",
    "\n",
    "t_data = np.arange(0, time_end, sample_time)\n",
    "x_data = np.zeros_like(t_data)\n",
    "y_data = np.zeros_like(t_data)\n",
    "\n",
    "for i in range(t_data.shape[0]):\n",
    "    x_data[i] = model.xc\n",
    "    y_data[i] = model.yc\n",
    "    model.step(np.pi, 0)\n",
    "    \n",
    "plt.axis('equal')\n",
    "plt.plot(x_data, y_data, label='Learner Model')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "The plot above shows the desired circle of 10m radius. The path is slightly offset which is caused by the sideslip effects due to $\\beta$. By forcing $\\beta = 0$ through uncommenting the last line in the loop, you can see that the offset disappears and the circle becomes centered at (0,10). \n",
    "\n",
    "However, in practice the steering angle cannot be directly set and must be changed through angular rate inputs $\\omega$. The cell below corrects for this and sets angular rate inputs to generate the same circle trajectory. The speed $v$ is still maintained at $\\pi$ m/s."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "sample_time = 0.01\n",
    "time_end = 20\n",
    "model.reset()\n",
    "\n",
    "t_data = np.arange(0, time_end, sample_time)\n",
    "x_data = np.zeros_like(t_data)\n",
    "y_data = np.zeros_like(t_data)\n",
    "\n",
    "for i in range(t_data.shape[0]):\n",
    "    x_data[i] = model.xc\n",
    "    y_data[i] = model.yc\n",
    "    \n",
    "    if model.delta < np.arctan(2/10):\n",
    "        model.step(np.pi, model.w_max)\n",
    "    else:\n",
    "        model.step(np.pi, 0)  \n",
    "\n",
    "plt.axis('equal')\n",
    "plt.plot(x_data, y_data, label='Learner Model')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here are some other example trajectories: a square path, a spiral path, and a wave path. Uncomment each section to view."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "sample_time = 0.01\n",
    "time_end = 60\n",
    "model.reset()\n",
    "\n",
    "t_data = np.arange(0,time_end,sample_time)\n",
    "x_data = np.zeros_like(t_data)\n",
    "y_data = np.zeros_like(t_data)\n",
    "\n",
    "# maintain velocity at 4 m/s\n",
    "v_data = np.zeros_like(t_data)\n",
    "v_data[:] = 4 \n",
    "\n",
    "w_data = np.zeros_like(t_data)\n",
    "\n",
    "# ==================================\n",
    "#  Square Path: set w at corners only\n",
    "# ==================================\n",
    "'''\n",
    "w_data[670:670+100] = 0.753\n",
    "w_data[670+100:670+100*2] = -0.753\n",
    "w_data[2210:2210+100] = 0.753\n",
    "w_data[2210+100:2210+100*2] = -0.753\n",
    "w_data[3670:3670+100] = 0.753\n",
    "w_data[3670+100:3670+100*2] = -0.753\n",
    "w_data[5220:5220+100] = 0.753\n",
    "w_data[5220+100:5220+100*2] = -0.753\n",
    "'''\n",
    "\n",
    "# ==================================\n",
    "#  Spiral Path: high positive w, then small negative w\n",
    "# ==================================\n",
    "'''\n",
    "w_data[:] = -1/100\n",
    "w_data[0:100] = 1\n",
    "'''\n",
    "\n",
    "# ==================================\n",
    "#  Wave Path: square wave w input\n",
    "# ==================================\n",
    "#w_data[:] = 0\n",
    "#w_data[0:100] = 1\n",
    "#w_data[100:300] = -1\n",
    "#w_data[300:500] = 1\n",
    "#w_data[500:5700] = np.tile(w_data[100:500], 13)\n",
    "#w_data[5700:] = -1\n",
    "\n",
    "# ==================================\n",
    "#  Step through bicycle model\n",
    "# ==================================\n",
    "for i in range(t_data.shape[0]):\n",
    "    x_data[i] = model.xc\n",
    "    y_data[i] = model.yc\n",
    "    model.step(v_data[i], w_data[i])\n",
    "    \n",
    "plt.axis('equal')\n",
    "plt.plot(x_data, y_data, label='Learner Model')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We would now like the bicycle to travel a figure eight trajectory. Both circles in the figure eight have a radius of 8m and the path should complete in 30 seconds. The path begins at the bottom of the left circle and is shown in the figure below:\n",
    "\n",
    "![title](figure8.png)\n",
    "\n",
    "Determine the speed and steering rate inputs required to produce such trajectory and implement in the cell below. Make sure to also save your inputs into the arrays v_data and w_data, these will be used to grade your solution. The cell below also plots the trajectory generated by your own model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD8CAYAAACMwORRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3Xd4XMW5x/HvrFa9d6tLtuXeLXdjDMYYg4FAwFRD6BBICAnpCSHkkuQmhIRLCJgWauhgTAm9uBfJVS6SbBVbvXdptWXuH5Id47hJlvbsHr2f59Gj3dXunlfHq5/nzJkzo7TWCCGEMBeL0QUIIYTofxLuQghhQhLuQghhQhLuQghhQhLuQghhQhLuQghhQhLuQghhQhLuQghhQhLuQghhQlZ3biwmJkanp6e7c5NCCOH1cnJyarXWsb15jVvDPT09nezsbHduUgghvJ5SqqS3r5FuGSGEMCEJdyGEMCEJdyGEMCEJdyGEMCEJdyGEMCEJdyGEMCEJdyGEMCEJdyGEMCEJdyGEMCEJdyGEMCEJdyGEMCEJdyGEMCEJdyGEMCEJdyGEMCEJdyGEMCEJdyGEMCEJdyGEMCEJdyGEMCEJdyGEMCEJdyGEMCG3LpAthPA+dqeLDruTzi4nHXYnWoOPRR3+CvTzIdTfilLK6FLFESTchRjE7E4XB+vbKapto6i2jeK6NqqabdS0dH/VttqwOVwnfR8fiyIswEpEkB/RwX4kRQaSFBFIcmQQadFBjIgPJTbU3w2/kThEwl2IQcLp0uytbGZHaRM7SpvYWdZIXmULdqc+/JzwQF8SwgOIDfVnaEwwMaH+hPpbCfTzIdDPhwCrDxYLOJwal9bYnZpOu5PGdjtNHXYaO+zUtHSy5UADH+yowOH6z3vHhPgxckgoYxLCmJoWRVZ6JDEhEvgDRcJdCJPSWrO/po21+2pZt7+WDYX1NHXYAQgLsDIhOYKb5g4lMy6E9JhghsYEExns12/bd7o0Vc2dFNW2sbeyhb0VzeRVtfD8+hKeWl0EwNCYYKZnRDF/ZCxzhscQGuDbb9sf7JTW+uTP6idZWVk6OzvbbdsTYrBxuTTbSxv5aFcln+yqoqi2DYDkyEDmDIth1rBoJqdGkBoVZFgfuc3hJLesieziBjYXN7CxqI6WTgdWi2JaehQLRsexZEIiQ8IDDKnPEymlcrTWWb16jYS7EN6vsKaVN3JKWbG1jIqmTqwWxaxh0Zw7dgjzR8SSEhVkdInHZXe62FLSwJd5NXy5t5q8qhaUghkZUVw0MYnzxw8hIqj/jii8kYS7EINIp93Jym3lvJZ9kJySBnwsijNHxHLhxATOHhlPeJB3dnEU1rSycns5K7eXU1jThp/VwoUTErl2ZiqTUiIG5agcCXchBoHq5k5e3FDCyxsPUN/WxfC4EC6fmswlk5OICzNPV4bWmtyyZl7LPsA7W8po63IyNjGMG+ZkcPGkRHx9Bs9lOhLuQpjYgbp2/v5lAe9sLcPh0pwzOp4b52Qwc2iU6VuzrTYHK7aW8eL6EvKqWkiKCOTWeUNZmpVCoJ+P0eUNOAl3IUzoYH07j325jzdzSvGxKK6clsINczJIjwk2ujS301rzVV4Nj325j+ySBqKD/bjzrOFcMzMVf6t5Q17CXQgTaWq388jnBby4oRiF4uoZqdwxfxjxJup6OR2biur522f5rNtfR0pUIPeeO5ILJyRisZjvKEbCXQgTcDhdvLr5IH/5JI/GDjtXZKVw9zmZJIQHGl2ax9Fas6qglj/+ey97KpqZkBzO7y4ex8SUCKNL61cDEu5KqWeBJUC11npcz2P3A7cANT1P+4XW+sOTbUzCXYgT21HayE/f2smeimZmZERx34VjGJsYbnRZHs/l0qzYVsYf/72XmlYb185I495FIwkP9M4RQ0cbqHCfB7QCLxwV7q1a64d6szEJdyGOraPLyd8+y+ep1YXEhvrzmwvHsnjcENOfKO1vzZ12Hv4knxfWFxMV7M/vLh7L4vEJRpd12voS7icdS6S1XgXU97kqIcQJ5ZQ0sPiRVSxfVcgV01L49Idncv74BAn2PggL8OX+i8ay8q65JIQHcMfLW/jha9sOT7swmJzOQNG7lFI7lFLPKqUi+60iIQYJp0vz9y8KWLp8PQ6X5l83z+APl04gTOZXOW3jksJ5+7uzuXtBJu9uL2fx31axbl+t0WW5VV/D/XFgGDAJqAD+crwnKqVuVUplK6Wya2pqjvc0IQaVyqZOrn16Iw99ks8F4xP48O4zmD08xuiyTMXXx8I9C0fw1h2zCfDz4ZpnNvL3Lwpwudw3iMRIpzRaRimVDrx/qM/9VH92NOlzFwKyi+u5/aUc2ruc/PaisVw2NVm6YAZYe5eDn7+9k3e3lXP2qDj+unSSV03P0Jc+9z5N+auUStBaV/TcvQTI7cv7iL7ptDupau48vJhCTWsXzR12bPbulXI67S4cLo3VorD6KKwWhb/Vh4ggX8IDfYkI8iMq2JekiCDiQv1NOS7YU7266QC/fjeX5MggXrllJpnxoUaXNCgE+Vn52xWTyEqL5IH3d7Pk76t55vppjDDx/j9puCulXgHmAzFKqVLgN8B8pdQkQAPFwG0DWOOg1WZzsKu8mZ1lTeyrbqW4Z6WciqbOYz5fKQiw+hDga8HHYsGlNQ5nd9DbHC6cxzgc9fOxkBgRQEpUECPjQxmVEMaoIaEMjwshwNe8V/y5m9OleeC9XTy/voR5I2J59MrJXtVyNAOlFMtmpTM2KZzbXszh24+v44lrpzLHpN1hchGTBylr7GDdvu5FFbYdbKCwto1D/zyRQb6kxwSTER1MekwwiRGBxIb6ExPiR2yIP2GBvvhbLcc9vNda02pz0Nhup7HdTm2bjbKGDkobOihtaKekrp2C6hY67d1LqlktirFJ4UxLi2RaRhRZaZFEy6o5fdJpd/KDV7fx0a5Kbp6bwc/PH42PHC0ZqrShnRuf20xhTRu/v3Q8S7NSjC7phOQKVS9jczhZt7+OT3dXsXZfLSV17QBEBfsxJTWS8UnhjE8OY1xSOHGhA3/JudOlKa5rY29FC7nlTeQUN7CttJGunjU0JySHc9bIOM4eFcf4pHDpzjkFTR12bn0hm41F9dy3ZAw3zs0wuiTRo7nTzp0vb2F1QS0/WzyK288cZnRJxyXh7gU67U6+2FvNhzsr+Cqvhlabg2A/H2YNi2HO8GhmDYtmRFyoxwSnzeFkZ2kTGwrr+DKvhq0HGnBpiAnxZ8mEBC6alMjkQTrH9snUt3VxzdMb2VfdwkOXT+TiSUlGlySOYne6+NHr21m5vZy7F2Tyg3MyPfKzLOHuobTW7Cht4s2cUlZuL6epw050sB8Lx8SzaOwQZg2L9pr+7fq2Llbl1/Dxrko+31tNl8NFalQQF09K5MrpqSRFyPwnAA1tXVz99Eb217Ty5LKpzB8ZZ3RJ4jicLs3P3trBGzml3DpvKD9fPMrjAl7C3cN02p2s3F7OP9cWs6eiGX+rhfPGDeHbU5KZMzzG6/tdWzrtfLyrine3lbG25wKRs0fFs2xWGmcMj/GYow93a2zvbrEXVLfy1HVZnDki1uiSxEm4XJr739vFC+tLuPOsYfx40SijS/oGtw2FFCdW12rj+fUlvLyhhLq2LkbGh/LgJeO4cGKiqa4+DA3w5bKpyVw2NZnShnZe2XSAVzcd5LM9VQyNCeb2+cO4ZHLSoFoxp83m4PpnN1FQ1cqT102VYPcSFovitxeNxe7UPPblfsICfLnNg/vgT4W03PtRfVsXy1ft54V1JXQ6nCwYFceNczKYNSza4w7zBorN4eSj3EqWf13I7ormwyvmXDEtxWu6nvrK7nRx8/PZrC6oYfmyLBaOiTe6JNFLTpfm7le38v6OCv5w6Xiump5qdEmAdMsYprnTzhNf7ee5dcV02J1cNDGR752dyfC4EKNLM4zWmq/ya3jsi+4VcxLCA/jhwhFcOiXZ67ujjkVrzY/f3MGbOaUeFQqi97ocLm59MZtV+TU8851pnOUB50sk3N3M4XTxWvZBHv4kn/r2Li6ckMj3FwxneJx5r3rrLa016wvr+N9/72V7aROjhoTys8WjTHeC8ZHPCvjrZ/ncvSCTexaOMLoccZrabA4uf2I9B+rbefu7sw2/klXC3Y3W76/jt+/tYm9lC9PTuxdVGJckiyocj9aaD3ZW8KeP8jhQ387CMfHcf9FYU4yu+XR3Fbe8kM2lk5P4y9KJg6YLzuwqmjq46O9rCfC1sOK7cwy9iE/C3Q2aOuz84cM9vLr5IMmRgfzi/NGyqEIvdDlcPLu2iL99lo9Ccc/CTG6Yk+G1J133VbfyrcfWkhETzBu3zzL9eYXBZvvBRpYuX8+U1EheunmGYV2KA7JYh/iPj3dVsvDhr3k9+yC3zRvKp/fIogq95We1cPuZw/j0njOZPSya33+4l0v+sZaCqhajS+u1VpuD217Mxt9qYfmyqRLsJjQxJYIHLxnP+sI6Hvm8wOhyekXC/RS02Rz8+I3t3PZiDtEh/rx751x+fv5oAv3kj7mvUqKCePr6LB6/ZgrljZ0seXQN/1xb5FVzbd+/chdFtW08evVkEk3QvSSO7dBw30e/KGBNgfcs+CHhfhK5ZU1c+Oga3txSyl1nDWflXXMYnyx96/1BKcXi8Ql89IMzmDs8ht++t5vrnt1ETYvN6NJO6v0d5byZU8qdZw1n9jBzzioo/uOBi8cyPDaEH7y2ldpWz/98goT7cWmteWF9MZf8Yy3tXU7+dfNM7l000mv7hj1ZXGgAT1+fxe8vGc/m4nqWPLqanBLPXba3rLGDX7y9k0kpEXx/QabR5Qg3CPKz8tg1U2jucPDrFbm481xlX0lSHYPN4eSnb+3gvnd3cUZmLP+++wxmDYs2uixTU0px9YxU3vnuHAJ8fbhi+QaeW1vkcX9EWnfPQ+J0aR65cpL8Zz+IjIgP5YfnjuDfuZW8t6Pi5C8wmHwyj1Ld3MmVT27g9ezubpinr8siMtjP6LIGjTGJYay8ay7zR8Zy/3u7+fnbO7E7XUaXddiKbWWsLqjlJ+eNIi062OhyhJvdcsZQJqVEcN+7uVS3HHvRHE8h4X6EfdUtfOuxteRVtvCPa6Zw76KRg3byKyOFB/ry5LIs7jprOK9uPsiNz22mpdNudFnUt3Xxu/f3MDk1gmtnphldjjCAj0Xx0OUTabc5+f0He4wu54Qk3HvklDRw2RPr6XJqXr9tFuePTzC6pEHNYlHcu2gkf/r2BNbvr+PyJ9ZT0dRhaE2//3APzR12/njpBFNOoSBOzfC4EG47cygrtpWzsbDO6HKOS8Id+GJvFdc8vYGIQF/e+e5sudLUgyydlsI/b5hGaUMHS5ev52B9uyF17Cht5M2cUm46I4ORQ2R6icHuu/OHkxQRyG9W7sLhQd2GRxr04f7p7ipuezGHzLhQ3rxjNilRQUaXJI5yRmYsL988g+YOB0uXr6eots2t29da8z/v7yE62I+7zhru1m0LzxTo58Ovl4xmb2ULL288YHQ5xzSow/2z3VV89+UcxiSG8/ItM4iRBaA91sSUCF65ZSY2h4uly9ezr7rVbdv+eFclm4rr+eG5Iwg10Xz84vQsGjuEmUOjePSLAtpsDqPL+S+DNty/2FvFHS/nMCYhjBdunG6qRTTMakxiGK/dOhOtYdkzGylrHPg+eKdL86eP8siMC+GKrJQB357wHkopfrxoFLWtXTy3rtjocv7LoAz3nJJ67nhpC6OGhPHCTTMID5Rg9xaZ8aG8cON0Wm0Olj29ccCvFnx/RzmFtW38cOEIrDKmXRxlalok54yO44mv99PY3mV0Od8w6D6t+6pbuen5bBLCA3juhmkS7F5oTGIY//zONMqbOrj+2U0DNkzS6dI8+sU+RsaHsmjskAHZhvB+9y4aSUung2fXFBldyjcMqnCvbu7k+mc3YbUoXrhxhqHzM4vTk5UexePXTmVvZQs/eHUbzgGYcOzDnRXsq27lewuGy/UO4rhGDQnjnNHxvLChhPYuz+l7HzThbnM4ue2lHBrau3juhumkRsuoGG931sg47r9wDJ/vreZ/P9rbr++tteap1YUMjQ3m/HFyzYM4sdvPHEpju503skuNLuWwQRHuWmt+8+4uth5o5C+XT5Rx7CaybFY6181K48lVhby++WC/ve/Wg43sKG3ihtnp0moXJ5WVHsWU1AieXlPoMePeB0W4v7zxAK9uPsidZw1jsVx5ajr3LRnD3OEx/OrdXHaVN/XLez63tphQfyuXTknul/cT5nfLGUM5WN/BV3k1RpcCDIJwzy1r4rfv7WL+yFh+uHCk0eWIAWD1sfDIlZOIDPLlrn9tpfU0xxxXN3fy4c4Klk5LIdjf2k9VCrM7Z0w8saH+vLrZMy5qMnW4t3c5+P4rW4kO9uevSyfJfCAmFh3iz6NXTaGkro1fvL3ztKYKfmdrGQ6X5poZqf1YoTA7Xx8Ll09N5ou91VQ2GT9jpKnD/YH3dlNU18bDSyfKtL2DwPSMKH507khWbi/n7S1lfXoPrTVvbSllSmoEQ2ND+rlCYXZXTEvBpeH17P47/9NXpg33T3ZV8urmg9x+5jBmD5dl0AaLO84cxvT0KH773i6qmnvfetpV3kx+VSuXSF+76IO06GBmZESxcnu54QvNmDLcmzrs/GpFLqMTwrjnnBFGlyPcyGJR/OmyCXQ5Xfy8D90z72wtw9dHceEEOfEu+mbJxET2VbeSX+W++Y+OxZTh/r8f7aW21cb/fns8flZT/oriBNJjgvnJolF8sbe6V90zWms+yq3kjMxYIoKkG0/0zXljh2BR8MGOckPrMF3ybSqq518bD3DjnAwmJEcYXY4wyHdmpzMlNYLff7iHpo5Tm55gb2ULZY0dLBwTP8DVCTOLDfVnRkY07+80dp1VU4W706W5791ckiIC+eG50h0zmFksigcuHkd9exd//TT/lF7z6e4qlIIFo+MGuDphdueOjaewpo0DdcYsLgMmC/fXsw+yt7KFX5w/miA/GZ882I1LCufq6am8uKGEvZXNJ33+53uqmJQSQVxogBuqE2Y2b0QsAKsKjLugyTTh3tJp5y+f5JGVFsn542UGP9Ht3nNHEhpg5cGTLGbc3GlnZ1kT8zJj3VSZMLOhMcEkRQSy2pPDXSn1rFKqWimVe8RjUUqpT5VSBT3fIwe2zJNb/nUhta1d/HrJGJSSi5VEt8iepfFWF9Syfv/xFzPOLq7HpWHm0Gg3VifMSinFvBGxrNtXZ9hcM6fScn8OOO+ox34GfK61zgQ+77lvmIa2Lv65togLJiQwMUVOoopvunZmGkPCAnjok7zjDo3cUFiPn4+Fyany+RH9Y+bQKFpsDvKqWgzZ/knDXWu9Cqg/6uGLged7bj8PfKuf6+qVp9cU0m53cveCTCPLEB4qwNeH7y/IJKekgS/zqo/5nI2FdUxKiSDA18fN1QmzmpLa3aGx9UCjIdvva597vNa6AqDnu2HDCxraunh+XQnnj09gRHyoUWUID3d5VjIpUYH8/Yt9//Uzu9PFnooWabWLfpUcGUhMiJ/XhfspU0rdqpTKVkpl19T0/8mF59cX02pz8P2zpdUujs/Xx8LNc4ey5UAjOSXfPBDdV91Kl9PFmMQwg6oTZqSUYnJqJFsPNBiy/b6Ge5VSKgGg5/uxj3UBrfWTWussrXVWbGz/jkSwOZy8tOEAZ42MZeQQabWLE7s8K5mIIF+Wf134jcf313RfJi5HfqK/jU0Mo6iujU670+3b7mu4rwSu77l9PfBu/5TTOx/sqKC21cYNczKM2LzwMkF+VpbNTOPTPVUU1vxn3o9D07MmhMv4dtG/MuNC0fo/DQh3OpWhkK8A64GRSqlSpdRNwB+BhUqpAmBhz3230lrzz7XFDIsN5oxMmfVRnJpls9KwKMVrRyzJV91iw99qITzQ18DKhBllxndPG72v2v3hftLLOLXWVx3nRwv6uZZeyS1rZmdZEw9cPFbGtYtTFhcawIJRcbyZU8qPzh2Jn9VCU7udiCBf+RyJfpceHYyPRVFgwAyRXnuF6ltbSvGzWrh4YpLRpQgvc9X0VOrauvh8TxXQPVpGZg8VA8HPaiExIoDSBvfPMeOVn+guh4uV28tZODqe8CA5lBa9M29ELEPCAnitZ7WcLqcLXx+v/FMQXiAhLJAKA5bd88pP9Fd51dS3dXHpFGm1i97zsSgumpTI2n21NHfaMXa9HGF2Q8IDqOzDqmCnyyvD/YOdFUQG+R6eeU2I3lo0Nh67U/Pl3moCfX3o7HL/UDUxOCSEB1DR1On2Zfe8LtztThdf7K3mnNHxcigt+mxySiSRQb6sKaglyM+HdgPGIYvBISbEny6HizY3NyC8Lh03FtbT0umQ1XLEabFYFFPTIsk50ECgnw/tNgl3MTBCAroHJbZ2Oty6Xa8L9093VxLga+EMmXdbnKYpaZEU1rThcGq6nC5sDgl40f9C/HvC3XZqyz32F68L91UFtcweFkOgn8zeJ07PuMRwgMMnu051rVUheuNQy71FWu7HV9nUSVFtG7OHyYIK4vRlxAQD3TOLAjRLuIsBEGDtboh2uPm8jleF+8ai7pV0ZLUc0R+SIgLxs1qo7wl3abmLgWDUhc9eFe4bCusIC7AyOkGmZhWnz2JRJEcE0mrrPlxudvNhsxADyavCfUtJI1PTIvGxyBwgon9EBvsd7gt1OOVyJmEeXhPuHV1OCqpbGJ8UbnQpwkQig/xo7uzujnG6jFnIWJiby9XdaLC4uX/Ga8J9b2UzLg1jJdxFP4oK9uXQhYMGLVIvTO5Qt9+hIZHu4jXhnlvWBMA4CXfRjyKD/Q7fdkjLXQwACfeTyK9qJTTASqKsliP6UfQR4R7gK9dOiP53KNyDJdyPrbiujYyYYFlQQfSr6GD/w7cDJdzFADh0/URogIT7MZXUtZMWHWx0GcJkokOk5S4GVmVzJxFBvm7/fHlFuHc5XJQ2tJMeHWR0KcJkYkKk5S4GVmWTjSFh7u9O9opwr2ruxKUhOTLQ6FKEySQccQ4n6ohWvBD9pbK5gyEGnCv0inCv67k8/MhWlhD9IeqIE6pHnlwVor+UN3Z+oxHhLt4R7q02AKIl3EU/O/IEvfS5i/7W0NZFfVsXQ2NC3L5tLwn37pa7tKyEEN5kX00rAMPjJNyPqbGjO9wjJdzFAGrvkonDRP8qqJJwP6FOe/eVgwFWryhXeJEjFy3eU9FsYCXCjPKrWgj09SEpwv2DQbwiLTvtTqwWhVUWxBb9rKbFdvh2bpmEu+hf2w42Mj4pHIsBM9l6RVraHC452SUGRGFt2+HbO3vmLxKiP9gcTnaXNzMpNcKQ7XtFuNudLqw+Mu2A6H+7y7tb6+OTwtlS0mBwNcJMdpc30+V0MSlFwv24fCwKpyykIAbAzrIm4sP8uWhiIoW1bVT1LJYtxOnK6WksTJaW+/H5+Viwy3SsYgDsLGtifFIEs3oWXd9QWGdwRcIs1uyrZWhMMAnhxlxZ7xXhbvVR2KXlLvpZq83B/ppWJiSHMzohjLAAK+v3S7iL02dzONlQWMcZmTGG1eAV4e7n44PTpXHIUjmiH20uqkdrmJLavS7v7GExfJVX843hkUL0RU5xA512F2dkxhpWg1eEe3hg9zzITT3zIgvRH9btr8XPx0JWeiQAC8fEU9ncKaNmxGn7Kr8GXx/FzJ7uPiN4RbgfujK1oV3CXfSfdfvrmJIWcXiY7dmj4vCxKD7ZVWVwZcKbaa35YEcFc4bHuH1pvSN5RbhHBHWHe2N7l8GVCLNoaOtid0Uzc4b9p080MtiPrLRIPtldaWBlwtvtKG2irLGD88cnGFqHV4R7VE+417dJuIv+8fnearSGM0d+s0/0ggkJ5Fe1Hh7/LkRvfbizAqtFce6YeEPr8IpwT4jongu5rLHD4EqEWXy8q5LE8ADGJ4V/4/ElExLx9VG8vaXUoMqEN3O6NO9tL2duZszhHgejeEW4Rwf7EeTnw8F6CXdx+tq7HKzKr+HcsUP+a8H1qGA/zhoZx4pt5TI6S/TaqoIayps6uXxqitGleEe4K6VIiQziYEO70aUIE/gqrwabw8W5Y4992PztqcnUttr4Or/GzZUJb/fapoNEBfux0OAuGTjNcFdKFSuldiqltimlsvurqGNJiQrkQJ2Euzh9b+WUEhfqz/T0qGP+/KyRccSF+vP8+hI3Vya8WU2Ljc/2VPHtKUn4ecD05P1RwVla60la66x+eK/jGh4XSmFtK10OOVQWfVfd0slX+TVcOiX5uFNI+1ktXDszjVX5NeyrbnVzhcJbvbyxBIdLc+X0VKNLAbykWwZgdEIodqdmf438sYm+W7G1DKdLc9nU5BM+7+oZqfj5WHh+XbF7ChNeraPLyQvrS1gwKo5hse5fdelYTjfcNfCJUipHKXXrsZ6glLpVKZWtlMquqel7H+aYhDAAGaIm+kxrzWubDzI5NeKky57FhPhz0aRE3swplSG44qTe3NL9Obll3lCjSznsdMN9jtZ6CrAYuFMpNe/oJ2itn9RaZ2mts2Jj+z7PQkZMMP5WC7tlKTTRR6sKatlf08aymWmn9PzbzxxKp8PJ06sLB7gy4c0cThfPrC5kYnI4MzKOfR7HCKcV7lrr8p7v1cA7wPT+KOpYrD4WJiSHH54jWYjeemZNEbGh/iyZkHhKzx8eF8oF4xN4fl0xDdJ6F8fxztYyiuvauWP+8P8aWmukPoe7UipYKRV66DZwLpDbX4Udy/SMKHLLmmSVetFrBVUtrMqv4bqZab0ayfD9BZm02508vUZa7+K/2RxO/vZZAeOTwll0nKG1Rjmdlns8sEYptR3YBHygtf6of8o6tukZ0Thcmq0HGgdyM8KEnvi6EH+rhatn9G4kw4j47tb7s2uKZZUm8V9e3XSQssYOfrxopEe12uE0wl1rXai1ntjzNVZr/WB/FnYsU9MisSjYKKvliF4oqm3jna2lLJuZRnSIf69f/5NFo3C6NH/+OG8AqhPeqqXTzqNf7GN6RpShi3Icj9cMhQQI8bcyJTWSL/PkykFx6h79vAA/q4XbzhzWp9enRgdxw5x03tpSSq7M9S56PPJZAXVtNn55/mguAAq+AAAWWUlEQVSPa7WDl4U7wNmj49hZ1iSHyOKU7KtuZcW2Mq6blU5saO9b7YfcefZwIoP8eOC93bhcslLTYJdf1cI/1xVz5bQUJqYYswD2yXhduC8Y1X3S4su91QZXIrzBHz7cQ5CflVtPc/xxWIAvPz1vJJuK63k9+2A/VSe8kdaa+1fuIsTfyo8XjTK6nOPyunAfER9CUkQgn+6W1XLEiX2dX8Pne6v53tnDielDX/vRlmalMHNoFA9+uIdqOXIctF7PPsi6/XXcu2gkUcHGTut7Il4X7kopLpiQwNf5NTL2WByX3enid+/vJi06iO/MSe+X91RK8YdLJ2BzuLjv3V398p7Cu5Q3dvA/7+9hRkYU13jIHDLH43XhDnDxpEQcLs0HOyuMLkV4qOfXFbOvupVfnj8af6tPv71vRkwwdy/I5KNdlbyzVRb0GEy01vzs7Z04XJo/XzYRi8XzTqIeySvDfUxCGCPiQ1ixtczoUoQHOlDXzkOf5LFgVNyAzKt927yhTEuP5Ncrdsk01IPISxtKWJVfw88WjyI1Osjock7KK8NdKcXFk5LILmmgqLbN6HKEB+luXe3AarHwP5eMG5AhalYfC3+9YhJKwd2vbcUuKzaZXm5ZE797fw/zR8ae8txERvPKcAe4fGoyVovipQ2yoIL4j9c2d5/s+vn5o0gIDxyw7SRHBvHgJePZeqCRhz6Ri5vMrKXTzp3/2kJUsB8PL53k8d0xh3htuMeFBbBo3BDeyD5IR5fT6HKEByisaeWB93cza2g0V00b+JNdF01M5JoZqSz/upD3tpcP+PaE+7lcmp++tYPShg4evXqyR4+OOZrXhjvAdTPTaO508O426Xsf7GwOJ997ZSt+1u4uE3e1rn5z4Viy0iL5yZs7ZK0BE3rk8wI+3FnJz84bxbTjLMvoqbw63KdnRDFqSCjPrCmSqwYHuT99lMeu8mb+fNlEhoQHuG27flYL/7h2CmGBVm59MZuaFpvbti0G1srt5TzyeQGXT03m5jMyjC6n17w63JVS3DF/GAXVrXyyu9LocoRB3t9RzjNrirhuVpohq87HhQbw5LIs6lq7uPG5zbTZZEpqb7flQAM/fmM709IjB+zE/EDz6nAHWDIhkfToIP7+5T60ltb7YLO7vJkfv7GDqWmR/PKC0YbVMTElgseumczuimbueHmLjKDxYnmVLdzwz83EhwXwxLVT+/U6CXfy+nD3sSi+O384uWXNfCWzRQ4q9W1d3PJCNuGBvjx+7RTD/wjPHhXPg98ax6r8Gn78xnac0lXodQ7UtbPsmY34Wy28fPOMPk0R7Sm8PtwBvjU5iZSoQP70cZ78QQ0SnXYnt76QTW2rjSevm0pcqPv62U/kyump/HjRSFZsK+cnb+6Qz6MXqWjq4NpnNtLldPHSzTNIifL8C5VOxBTh7me18JNFo9hT0cw7ctWq6TmcLu7611ZyDjTw8NJJTEj2rClX7zxrOPecM4K3tpTy07d2yMl+L3Cwvp2ly9dT39bFP78zjRHxoUaXdNpMEe4ASyYkMDElgoc+zpNx7yamteaX7+Ty2Z4qHrhoLBdMSDC6pGO6+5xM7l6QyZs5pdz7xnbpg/dgRbVtLF2+nuYOBy/fPIPJqZFGl9QvTBPuSil+ef5oKps7Wb5qv9HliAGgtebBD/bwWvZBvn/2cJbNSje6pBO6Z+EIfrRwBG9vLeOWF7JlYXcPtKu8iaXL12NzuHjllpkeu/BGX5gm3KF73PuSCQn846v9FNa0Gl2O6Edaa373/h6eXlPEd2anc8/CEUaXdEq+tyCTP1w6nlX5NVz11EbqZZpqj/Hl3mqWPrEeq0Xx2q0zGZMYZnRJ/cpU4Q5w35Ix+Fst/GpFrgyNNAmtNb99bzfPri3ihjnp/ObCMV417viq6ak8ce1U9lY0863H1pJX2WJ0SYPeSxtKuOn5zaTHBLPizjlkmqCP/WimC/e4sAB+ct4o1u2vk5OrJmB3uvjJmzt4bl0xN83N4L4l3hXsh5w7dgiv3DqTDruTS/6xlo9y5aI7I9gcTn69Ipdfrchl/sg4Xr9tFvFhnjHSqr+ZLtwBrpmeypTUCO5fuYvyxg6jyxF91GZzcPPz2byRU8rdCzL51QWeucr8qZqSGsl7d80lMz6U21/K4eFP82WopBuVNXawdPkGXtxQwi1nZPDksqkE+1uNLmvAmDLcLRbFw0sn4XBp7n1juwxF80LVLZ1c9dQG1uyr5Y+XjueehSO8OtgPGRIewGu3zuSyqcn83+cFXPXUBmmAuMGXedUs+b/V7K9u5fFrpvDLC8Zg9TFl/B1m2t8uPSaY+5aMYd3+Op5dW2R0OaIXth5o4MJH11BQ1cqTy6ZypYevVdlbAb4+/PmyCfzl8onkljWx+JHV0k0zQNq7HPxqxU5u+Odm4kIDePeuOSwe75nDZ/ubacMd4IppKSwcE8+fPspj+8FGo8sRp+C1zQe4YvkG/KwW3rpjNgtGu38iMHdQSvHtqcl88P0zSI0K4vaXcrjntW0ymqYfbT3QwAX/t4aXNhzg5rkZvHvXHIbFhhhdltsod44oycrK0tnZ2W7bHkBDWxdLHl2D1pr3vjfXq+eKMLP2Lge/Xbmb17IPckZmDP935WQivWhhhNPR5XDx9y8K+MdX+wkP9OW+C8dw0cREU3RDGaG5085fPs7jhQ0lJIQF8NDSicweFmN0WadFKZWjtc7q1WvMHu7Qvf7hpY+vY1p6JC/cOAMfL1kma7DYWdrE3a9upaiuje/OH8YPF44clP9Geyub+embO9he2sSZI2L59ZLRDI8z3xC9gaK15v0dFTzw/m5qW21cNzONHy0aSViAr9GlnTYJ9xN4PfsgP3lzBzfPzeBXS8YYUoP4JofTxVOri3j40zyig/356xWTmDUs2uiyDOV0aZ5bV8zfPsunvcvJsplp/OCcTCKCBsdRTF9tPdDAH/69l01F9YxLCuP3l4z3uDmHTkdfwt2844COsjQrhd3lzTy9poiUqCCun51udEmDWm5ZEz97ewe5Zc0sHjeEP1w6XgKM7imsb5qbwbcmJfKXT/N5YX0x72wt47Yzh3L9rHRTD93ri+LaNv78cR4f7KwgJsSP331rHFdPTx2UR35HGzQtd+huFd3+Ug6f76niiWuncu7YIYbVMli1dzn422cFPLOmiKhgP3570VgWjxsi/cvHsaeimT/+ey9f59cQFezHrfOGct2sNIL8BnfIF1S18PhX+3l3ezn+Vgu3nDGUW+YNJcSk//lJt8wp6OhycuVTG8irbOalm2aQ5WWL3norl0vz1pZS/vxxHtUtNq6ansrPFo8iPND7+0PdIaekgUc+L2BVfg2RQb5cPSOVZTPT3bperNG01mw92Mjyr/fz8a4qAn19uHpGKrfNG0qcSa8yPUTC/RTVttpY+sR6qltsvHjTdNNM8emp1u2v5cEP9rCrvJlJKRH8eskYpqbJPu+LnJJ6ln9dyKd7qvBRigsmJHDdrHSmpEaY9uino8vJyu1lvLihhNyyZsICrHxndjrfmZNB1CAZUSXh3guVTZ1c8WT35Pyv3DKTcUnhRpdkKlpr1hfW8chnBWwsqicpIpCfLh7FhRMSTBtC7nSgrp3n1hXzevZBWm0OhsYGc9nUZC6dnGyK1rzLpckuaeDdbWWs3F5OS6eDkfGhXDsrjUsmJ5m2++V4JNx7qayxg6VPrKety8FzN0xnkonmcjaKy6X5uqCGx7/cz6bieuJC/blj/jCump5KgK93LjTsyVptDj7cUcGbOaVsKq7Horqnvl40dggLx8STHOk9S8U5XZrtpY18vKuS97dXUNbYQYCvhXPHDOHamWlMS48ctA0DCfc+OFjfztVPb6CutYsnl2UxN9O7L3YwSqvNwVs5pTy/rpjC2jaGhAVwx/xhXDEtRULdTYpr23h7axkf5VaQX9W9nsG4pDDOHBHL7GExTE2L9Lh/i5oWGxsK6/hybzVf5ddQ39aFj0UxLzOGiyclsXBMvIwQQsK9z6qbO7nu2U0U1rTxyJWTBs3cE6dLa82WA428vaWUldvKabE5mJgSwQ2z0zl/fAJ+VlPPbuHRimrb+GRXJZ/urmLrwUacLo2fj4UpaRFMSY1kfFI445LCSY4MdFtr2OZwsr+6jdyyJrJL6tlc3EBRbRsAEUG+zB8Ry1mj4jhzRKwMiz2KhPtpaGq3c+Pzm9lyoIFfLB7NzWdkDNpDwBPRWrOvupV/51by9pZSiuvaCfC1sHhcAtfNSpOT0x6o1eZgc1E96wvrWL+/jj0VzTh6ZkqNDPIlMy6U9JggMmJCyIgJIiE8kJhQf2JC/PC3nnpLX2tNh91JbUsXpQ3tlDZ0UNrQTnFdO3mVLeyvaT283YggX7LSopiWHsm0jCgmJkfI2PQTcHu4K6XOAx4BfICntdZ/PNHzPTncofus/I/e2MaHOyu5bGoyD14yrlcfbrOyO11sPdDIp7u7W4LFde0AzBoazaVTklg8PmHQneDyZp12J3mVLewsayK3rInCmjYKa9uobbX913NDA6yEBfgS6OdDoK8PAb4WLErhdGkcLo3T1R3oTR12mtrtdB21ELhFQUJ4IKOGhDIqIZRRQ8IYnRDG0JhgLBLmp8yt4a6U8gHygYVAKbAZuEprvft4r/H0cIfuE4KPfF7AI58XMDUtksevmWL6MbRH67Q72VXexIbCejYU1pFd3ECH3Ymvj2LWsBgWjoln4eh4U4zKEP/R0mmnpK6dyqZOaltt1LTYqG210dLpoNPhpNPuoqPLidOlsfoorD4WrBaFv9VCRJAvEUF+RAT6EhnsR3JkICmRQQwJD8DX5POmu4O7w30WcL/WelHP/Z8DaK3/cLzXeEO4H/LBjgp+9MY2QvytPLx0EvNGxBpdUr9wuTT51S3Y7C5sDhcddidVzZ1UNHZSUt/G7vJmCqpbD68QNGpIKDOHRjNzaBRzhscQaoJJmITwNu6eWyYJOHjE/VJgxmm8n0e5YEICI+JDuOtfW7nu2U09sxWO8PrVW+wuF+f9bfUxfxYX6s+YxDAWjolnXFI409KjBs1FIkKYzemE+7E6zP7rMEApdStwK0BqqnetqJMZH8qKO+fwwPu7+MdX+1m7r5Y/Xz6REV68Urqfj4V/XDMFf6sFf2t3H2pcaADx4f5yfkEIE5FumVP0wY4Kfv1uLq2dDr6/YDi3nTlM+hKFEG7Rl26Z00mnzUCmUipDKeUHXAmsPI3382gXTEjgk3vmsXBMPA99ks+3HlvLlgMNRpclhBDH1Odw11o7gLuAj4E9wOta6139VZgnignx57FrpvD4NVOobbVx6T/W8aPXt1Pd0ml0aUII8Q1yEVMftdkc/P3LfTyzugg/q4U75g/jO7NlMQUhRP9zd7fMoBbsb+Wn543ik3vmMXNoNH/+OI95f/qSp1cX0ml3Gl2eEGKQk5Z7P9lyoIGHP8lnzb5a4sP8uWluBldOTzXF4rxCCGPJ3DIeYP3+Oh75PJ8NhfWE+Fu5cloKN8zNICki0OjShBBeSsLdg+SWNfHU6kLe31GB1pp5I2K5IiuFBaPjZbZEIUSvSLh7oLLGDl7ddIA3skupbO4kOtiPiyYlcsH4BKakRsrkSUKIk5Jw92BOl2ZVfg2vbT7IF3ur6XK6iAv157xx3SvmTEuP8riFFIQQnkHC3Uu0dNr5Ym81/95ZyZd51dgcLvytFqalRzE3M4YZGVGMSQyT6QCEEICEu1dq73KwsbCe1QW1rNlXc3h5NF8fxZiEMCamRDA2MYxhsSEMiw0hUibyEmLQkXA3germTnJKGthW2sj2g43sLG2ires/4+ajgv1IjQpiSFgA8WH+xIUFEB3sR7C/lWB/H4L9rPj7+qC1RtO9Oo7DqWm1OWjutNPS6aC5w05taxd3nT2cmBB/435ZIcQpcfeUv2IAxIUFsHh8wuF1XJ0uTVlDB/trWtlf08q+6lZKe+6v219Lc6ejT9sJC7CyNCtFwl0Ik5Jw93A+FkVqdBCp0UGcNSruv37e0eWkvr2LdpuDti4n7bbuVXMUChRYlMJHKUIDrD1fvoQFWqU/XwiTk3D3coF+PiT5yQVSQohvkqtphBDChCTchRDChCTchRDChCTchRDChCTchRDChCTchRDChCTchRDChCTchRDChCTchRDChCTchRDChCTchRDChCTchRDChCTchRDChCTchRDChCTchRDChCTchRDChCTchRDChCTchRDChCTchRDChCTchRDChCTchRDChJTW2n0bU6oGKDnioRig1m0F9D9vrl9qN4bUbhxvrn+k1jq0Ny+wDlQlx6K1jj3yvlIqW2ud5c4a+pM31y+1G0NqN44316+Uyu7ta6RbRgghTEjCXQghTMjocH/S4O2fLm+uX2o3htRuHG+uv9e1u/WEqhBCCPcwuuUuhBBiABgS7kqpy5VSu5RSLqVU1lE/+7lSap9SKk8ptciI+k6VUup+pVSZUmpbz9f5Rtd0Mkqp83r27T6l1M+Mrqe3lFLFSqmdPfu71yMI3Ekp9axSqloplXvEY1FKqU+VUgU93yONrPF4jlO7V3zelVIpSqkvlVJ7enLm7p7HPX7fn6D2Xu97Q7pllFKjARewHLhXa53d8/gY4BVgOpAIfAaM0Fo73V7kKVBK3Q+0aq0fMrqWU6GU8gHygYVAKbAZuEprvdvQwnpBKVUMZGmtPX68slJqHtAKvKC1Htfz2J+Aeq31H3v+c43UWv/UyDqP5Ti1348XfN6VUglAgtZ6i1IqFMgBvgV8Bw/f9yeofSm93PeGtNy11nu01nnH+NHFwKtaa5vWugjYR3fQi/4xHdintS7UWncBr9K9z8UA0FqvAuqPevhi4Pme28/T/YfrcY5Tu1fQWldorbf03G4B9gBJeMG+P0HtveZpfe5JwMEj7pfSx1/Mje5SSu3oOYz1uMO8o3jj/j2aBj5RSuUopW41upg+iNdaV0D3HzIQZ3A9veVNn3eUUunAZGAjXrbvj6odernvByzclVKfKaVyj/F1opaiOsZjhg7nOcnv8TgwDJgEVAB/MbLWU+Bx+7cP5mitpwCLgTt7ug+Ee3jV510pFQK8BfxAa91sdD29cYzae73vB2z6Aa31OX14WSmQcsT9ZKC8fyrqm1P9PZRSTwHvD3A5p8vj9m9vaa3Le75XK6XeoburaZWxVfVKlVIqQWtd0dO/Wm10QadKa1116Lanf96VUr50h+PLWuu3ex72in1/rNr7su89rVtmJXClUspfKZUBZAKbDK7puHo+IIdcAuQe77keYjOQqZTKUEr5AVfSvc+9glIquOckE0qpYOBcPH+fH20lcH3P7euBdw2spVe85fOulFLAM8AerfXDR/zI4/f98Wrvy743arTMJcCjQCzQCGzTWi/q+dkvgRsBB92HJP92e4GnSCn1It2HSRooBm471KfnqXqGUP0N8AGe1Vo/aHBJp0wpNRR4p+euFfiXJ9evlHoFmE/3bIRVwG+AFcDrQCpwALhca+1xJy6PU/t8vODzrpSaC6wGdtI9Kg/gF3T3XXv0vj9B7VfRy30vV6gKIYQJeVq3jBBCiH4g4S6EECYk4S6EECYk4S6EECYk4S6EECYk4S6EECYk4S6EECYk4S6EECb0/wh5ZUKVB/cXAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "path_radius = 8\n",
    "sample_time = 0.01\n",
    "time_end = 30\n",
    "model.reset()\n",
    "\n",
    "t_data = np.arange(0, time_end, sample_time)\n",
    "x_data = np.zeros_like(t_data)\n",
    "y_data = np.zeros_like(t_data)\n",
    "v_data = np.zeros_like(t_data)\n",
    "w_data = np.zeros_like(t_data)\n",
    "\n",
    "# ==================================\n",
    "#  Learner solution begins here\n",
    "# ==================================\n",
    "n = t_data.shape[0]\n",
    "max_delta = 0.993*atan2(model.L, path_radius)\n",
    "v_data[:] = 4 * np.pi * path_radius / time_end\n",
    "#model.delta = max_delta\n",
    "#w_data[n//8-50:n//8+50] = -2 * max_delta\n",
    "#w_data[5*n//8-50:5*n//8+50] = 2 * max_delta\n",
    "for i in range(n):\n",
    "    x_data[i] = model.xc\n",
    "    y_data[i] = model.yc\n",
    "    if i < n/8 and model.delta < max_delta:\n",
    "        w_data[i] = model.w_max\n",
    "    elif n/8 < i < 5*n/8 and model.delta > -max_delta:\n",
    "        w_data[i] = -model.w_max\n",
    "    elif i > 5*n/8 and model.delta < max_delta:\n",
    "        w_data[i] = model.w_max\n",
    "    model.step(v_data[i], w_data[i])\n",
    "    \n",
    "# ==================================\n",
    "#  Learner solution ends here\n",
    "# ==================================\n",
    "plt.axis('equal')\n",
    "plt.plot(x_data, y_data)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We will now run your speed and angular rate inputs through our bicycle model solution. This is to ensure that your trajectory is correct along with your model. The cell below will display the path generated by our model along with some waypoints on a desired figure 8. Surrounding these waypoints are error tolerance circles with radius 1.5m, your solution will pass the grader if the trajectory generated stays within 80% of these circles."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "The cell below will save the time and vehicle inputs as text file named $\\textit{figure8.txt}$. To locate the file, change the end of your web directory to $\\textit{/notebooks/Course_1_Module_4/figure8.txt}$\n",
    "\n",
    "Once you are there, you can download the file and submit to the Coursera grader to complete this assessment."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = np.vstack([t_data, v_data, w_data]).T\n",
    "np.savetxt('figure8.txt', data, delimiter=', ')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Congratulations! You have now completed the assessment! Feel free to test the bicycle model with different inputs in the cell below, and see what trajectories they form. For example, try moving in an equilateral triangle. You'll find that it's rather difficult to generate desired trajectories by pre-setting the inputs. The next module on vehicle control will show you an easier and more accurate method. See you there!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "sample_time = 0.01\n",
    "time_end = 30\n",
    "model.reset()\n",
    "\n",
    "t_data = np.arange(0,time_end,sample_time)\n",
    "x_data = np.zeros_like(t_data)\n",
    "y_data = np.zeros_like(t_data)\n",
    "v_data = np.zeros_like(t_data)\n",
    "w_data = np.zeros_like(t_data)\n",
    "\n",
    "# ==================================\n",
    "#  Test various inputs here\n",
    "# ==================================\n",
    "for i in range(t_data.shape[0]):\n",
    "\n",
    "    model.step(v_data[i], w_data[i])\n",
    "    \n",
    "plt.axis('equal')\n",
    "plt.plot(x_data, y_data)\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
